#include "ros/ros.h"
#include "string.h"
/*
演示
需要实现参数的新增与修改
需求：首先设置机器人的共享参数， 类型， 半径（0.15m）
实现：
    ros::NodeHandle -----------------------------
    param(“键”， 默认值)
    存在返回对应结果，否则返回默认值

    getParam（键， 存储结果的变量)
    存在，返回true， 且将值给参数2
    若键不存在， 那么返回值为false， 且不为参数2赋值

    getParamCached键， 存储结果的变量） --提高变量获取效率，缓存里拿参数
    存在，返回true， 且将值赋给参数2
    若键不存在，那么返回值为false， 且不为参数2赋值

    getParamNames（std::vector<std::string>>)
    获取所有的键， 并存储在参数ector中

    hasParam（键）
    是否包含某个键，存在返回true，否则返回false

    searchParam（参数1，参数2)
    搜索键，参数1是被搜索的键，参数2存储搜索结果的变量
    ros：：param----------------------------------

*/

int main(int argc, char ** argv)
{
    //设置编码
    setlocale(LC_ALL, "");
    //初始化ros节点
    ros::init(argc, argv, "get_param");
    //创建节点句柄
    ros::NodeHandle nh;

    //ros：：NodeHandle---------------------------
    //1，param
    double radius = nh.param("radius", 0.5);
    ROS_INFO("radius= %.2f", radius);

    //2,getparam
    double radius2=0.8;
    //bool result=nh.getParam("radius", radius2);
    
    //3. getParamCached //与getparam类似，底层不同， 性能提高；
    bool result=nh.getParamCached("radius", radius2);
    if(result){
        ROS_INFO("获得的半径是 %.2f", radius2);
    }else{
        ROS_INFO("被查询的变量不存在");
    }

    //getParamNames
    std::vector<std::string> names;
    nh.getParamNames(names);
    for(auto &&name: names){
        ROS_INFO("遍历的元素 %s", name.c_str());
    }

    //hasParam
    bool flag1=nh.hasParam("radius");
    bool flag2=nh.hasParam("radiusxxx");
    ROS_INFO("radius 存在吗？ %d", flag1);
    ROS_INFO("radiusxxx 存在吗？ %d", flag2);

    //searchParam
    std::string key;
    nh.searchParam("radius", key);
    ROS_INFO("搜索结果 ： %s", key.c_str());
    
    std::string key1;
    nh.searchParam("radiusxxx", key1);
    ROS_INFO("搜索结果 ： %s", key1.c_str());

    //ros::param
    double radius_param=ros::param::param("radius", 1.5);
    ROS_INFO("radius is %.2f", radius_param);

    std::vector<std::string> names_params;
    ros::param::getParamNames(names_params);
    for(auto && name1: names_params){
        ROS_INFO("键 %s", name1.c_str());
    }

    return 0;
}
